package com.wangp.mywrite.inwork.pattern._1._1_3_interval_char;

import com.wangp.mywrite.inwork.pattern.InitData;

/***
 * @author wangpeng
 * @since 2022-02-28  10:52
 */
public class IntervalChar {

    public static void main(String[] args) {
        // 上例中匹配了 n或s 开头的文件名，但是a 后面期望是数字而不是字母。例如：sam.xls 不期望获取到
        // 使用区间表达式

        String reg = "[ns]a[0123456789]\\.xls";
        // [na1.xls, na2.xls, sa2.xls]
        System.out.println(InitData.filterByRegexPattern(InitData.FILE_NAME_LIST, reg));

        // [0123456789] 又可表示为 [0-9]
        // 类似的 [abcdefg....xyz] 又可表示为 [a-z]
        // 类似的 [ABCDEFG....XYZ] 又可表示为 [A-Z]
        // 其中表示字母为 [A-Za-z]
        String alphabetReg = "[A-Za-z]";
        InitData.ALPHABET_LIST.forEach(alphabet -> {
            if (!alphabet.matches(alphabetReg)) {
                throw new RuntimeException("regex pattern not match");
            }
        });

        // 但是 [A-z] 表示的是字符A 与字符 z之间的所有ASCII 码。
        String symbolInAzReg = "[A-z]";
        InitData.SYMBOL_IN_A_z_LIST.forEach(symbol -> {
            if (!symbol.matches(symbolInAzReg)) {
                throw new RuntimeException("regex pattern not match");
            }
        });

        // illegal character range (to<from)
        String illegalReg = "[z-A]";
        // 这段代码执行报错 ：java.util.regex.PatternSyntaxException: Illegal character range near index 3
//        System.out.println("字母 A 字符匹配 [z-A]:" + "A".matches(illegalReg));

        // 如下正则会报错吗？
        String phase = "Regex";
        String phaseReg = "[rR]eg[eE]x";
        System.out.println("Regex 匹配 [Rr]g[Ee]x：" + phase.matches(phaseReg));
    }
}
